package com.study.ktandroid.coroutines_apply

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import kotlin.coroutines.CoroutineContext

/**
 * 当Activity结束了，协程、线程等任务也没有意义了，所以应该和生命周期绑定
 *
 * 之前我们使用的GlobalScope创建的协程没有生命周期，需要自己管理
 *
 * 1.实现 CoroutineScope接口，自己实现
 * 2.通过MainScope代理
 */

class CoroutineScopeActivity03_2 : AppCompatActivity(), CoroutineScope by MainScope() {

    // 为了保证协程占用资源被及时回收，要在退出时取消协程
    override fun onDestroy() {
        super.onDestroy()
        cancel()
    }

}

class CoroutineScopeActivity03_1 : AppCompatActivity(), CoroutineScope {

    lateinit var job: Job

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.IO + job

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        job = Job()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 当 Activity 销毁的时候取消该 Scope 管理的 job。
        // 这样在该 Scope 内创建的子 Coroutine 都会被自动的取消。
        job.cancel()
    }

    fun getData() = launch {
        val ioData = async(Dispatchers.IO) {
            // 执行阻塞的IO操作
        }
        val data = ioData.await()
        // 拿到data更新UI
    }
}